package com.itheima.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;

import javax.sql.DataSource;

/**
 * 1.引入配置文件
 *  @PropertySource(value="classpath:db.properties") //引入配置文件
 * 2.使用
 *  ${key}
 */
@PropertySource(value="classpath:db.properties") //引入配置文件
public class DaoConfig {
    //如果要使用配置文件的内容 需要先引入配置文件
    @Value("${jdbc.driver}") //支持el表达式 读取配置文件的key
    private String driver;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;


    /**
     * 此方法表示创建 QueryRunner
     *  3.配置queryRunner new QueryRunner(数据源)
     *  <bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner">
     *      <constructor-arg name="ds" ref="dataSource"></constructor-arg>
     *  </bean>
     * @Bean 声明在方法上 意义是: 将方法的返回值放入到容器中
     */
    @Bean(name = "queryRunner")
    public QueryRunner createQueryRunner(DataSource dataSource){ //参数会自动从容器中获得类型对象 注入过来 spring 5.0以后才可以
        QueryRunner queryRunner = new QueryRunner(dataSource);
        return queryRunner;
    }

    /**
     *  4.配置数据源  new DruidDataSource()  调用了一堆的set方法
     *  <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
     *      <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
     *      <property name="url" value="jdbc:mysql:///spring_db"></property>
     *      <property name="username" value="root"></property>
     *      <property name="password" value="root"></property>
     *  </bean>
     */
    @Bean(name="dataSource")
    public DataSource createDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

}
